package work.base.jvm.object;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 读进程和写进程问题
 *
 * Object wait() 方法让当前线程进入等待状态。
 * 直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
 * 一般用于线程的调度 也称线程间的协作 也称线程间的通信
 *
 * wait()和notify()方法的调用必须具有内置锁 synchronized(this) 的代码块内或同步方法才能调用，否则就会报该错误。
 *
 */
public class ObjectTest {

    public static void main(String[] args) throws InterruptedException {
        List<String> newList = Collections.synchronizedList(new LinkedList());

        new Thread(()->{
            synchronized (newList) {
                try {
                    System.out.println("读进程");
                    newList.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        TimeUnit.SECONDS.sleep(1);

        Thread.sleep(2000);
        new Thread(()->{
            synchronized (newList) {
                System.out.println("写进程");
                newList.notify();
            }
        }).start();

        System.out.println("END");

    }
}
